home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 1 / QRZ Ham Radio Callsign Database - December 1993.iso / ucsd / packet / tcpip / amiga / asrc29k.lha / arpcmd.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-01-08  |  4.4 KB  |  215 lines

  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include "global.h"
  4. #include "mbuf.h"
  5. #include "timer.h"
  6. #include "enet.h"
  7. #include "ax25.h"
  8. #include "arp.h"
  9. #include "netuser.h"
  10. #include "cmdparse.h"
  11. #include "commands.h"
  12. #include "rspf.h"
  13.  
  14. static int doarpadd __ARGS((int argc,char *argv[],void *p));
  15. static int doarpdrop __ARGS((int argc,char *argv[],void *p));
  16. static int doarpflush __ARGS((int argc,char *argv[],void *p));
  17. static void dumparp __ARGS((void));
  18.  
  19. static struct cmds Arpcmds[] = {
  20.     "add", doarpadd, 0, 4,
  21.     "arp add <hostid> ether|ax25|netrom <ether addr|callsign>",
  22.  
  23.     "drop", doarpdrop, 0, 3,
  24.     "arp drop <hostid> ether|ax25|netrom",
  25.  
  26.     "flush", doarpflush, 0, 0,
  27.     NULLCHAR,
  28.  
  29.     "publish", doarpadd, 0, 4,
  30.     "arp publish <hostid> ether|ax25|netrom <ether addr|callsign>",
  31.  
  32.     NULLCHAR,
  33. };
  34. char *Arptypes[] = {
  35.     "NET/ROM",
  36.     "10 Mb Ethernet",
  37.     "3 Mb Ethernet",
  38.     "AX.25",
  39.     "Pronet",
  40.     "Chaos",
  41.     "Arcnet",
  42.     "Appletalk"
  43. };
  44.  
  45. int
  46. doarp(argc,argv,p)
  47. int argc;
  48. char *argv[];
  49. void *p;
  50. {
  51.     if(argc < 2){
  52.         dumparp();
  53.         return 0;
  54.     }
  55.     return subcmd(Arpcmds,argc,argv,p);
  56. }
  57. static
  58. doarpadd(argc,argv,p)
  59. int argc;
  60. char *argv[];
  61. void *p;
  62. {
  63.     int16 hardware;
  64.     int32 addr;
  65.     char *hwaddr;
  66.     struct arp_tab *ap;
  67.     struct arp_type *at;
  68.     int pub = 0;
  69.  
  70.     if(argv[0][0] == 'p')    /* Is this entry published? */
  71.         pub = 1;
  72.     if((addr = resolve(argv[1])) == 0){
  73.         tprintf(Badhost,argv[1]);
  74.         return 1;
  75.     }
  76.     /* This is a kludge. It really ought to be table driven */
  77.     switch(tolower(argv[2][0])){
  78.     case 'n':    /* Net/Rom pseudo-type */
  79.         hardware = ARP_NETROM;
  80.         break;
  81.     case 'e':    /* "ether" */
  82.         hardware = ARP_ETHER;
  83.         break;        
  84.     case 'a':    /* "ax25" */
  85.         hardware = ARP_AX25;
  86.         break;
  87.     case 'm':    /* "mac appletalk" */
  88.         hardware = ARP_APPLETALK;
  89.         break;
  90.     default:
  91.         tprintf("unknown hardware type \"%s\"\n",argv[2]);
  92.         return -1;
  93.     }
  94.     /* If an entry already exists, clear it */
  95.     if((ap = arp_lookup(hardware,addr)) != NULLARP)
  96.         arp_drop(ap);
  97.  
  98.     at = &Arp_type[hardware];
  99.     if(at->scan == NULLFP){
  100.         tprintf("Attach device first\n");
  101.         return 1;
  102.     }
  103.     /* Allocate buffer for hardware address and fill with remaining args */
  104.     hwaddr = mallocw(at->hwalen);
  105.     /* Destination address */
  106.     (*at->scan)(hwaddr,argv[3]);
  107.     ap = arp_add(addr,hardware,hwaddr,pub);    /* Put in table */
  108.     free(hwaddr);                /* Clean up */
  109.     stop_timer(&ap->timer);            /* Make entry permanent */
  110.     ap->timer.count = ap->timer.start = 0;
  111. #ifdef    RSPF
  112.     rspfarpupcall(addr,hardware,NULLIF);    /* Do an RSPF upcall */
  113. #endif    /* RSPF */
  114.     return 0;
  115. }
  116. /* Remove an ARP entry */
  117. static
  118. doarpdrop(argc,argv,p)
  119. int argc;
  120. char *argv[];
  121. void *p;
  122. {
  123.     int16 hardware;
  124.     int32 addr;
  125.     struct arp_tab *ap;
  126.  
  127.     if((addr = resolve(argv[1])) == 0){
  128.         tprintf(Badhost,argv[1]);
  129.         return 1;
  130.     }
  131.     /* This is a kludge. It really ought to be table driven */
  132.     switch(tolower(argv[2][0])){
  133.     case 'n':
  134.         hardware = ARP_NETROM;
  135.         break;
  136.     case 'e':    /* "ether" */
  137.         hardware = ARP_ETHER;
  138.         break;        
  139.     case 'a':    /* "ax25" */
  140.         hardware = ARP_AX25;
  141.         break;
  142.     case 'm':    /* "mac appletalk" */
  143.         hardware = ARP_APPLETALK;
  144.         break;
  145.     default:
  146.         hardware = 0;
  147.         break;
  148.     }
  149.     if((ap = arp_lookup(hardware,addr)) == NULLARP)
  150.         return -1;
  151.     arp_drop(ap);
  152.     return 0;    
  153. }
  154. /* Flush all automatic entries in the arp cache */
  155. int
  156. doarpflush(argc,argv,p)
  157. int argc;
  158. char *argv[];
  159. void *p;
  160. {
  161.     register struct arp_tab *ap;
  162.     struct arp_tab *aptmp;
  163.     int i;
  164.  
  165.     for(i=0;i<ARPSIZE;i++){
  166.         for(ap = Arp_tab[i];ap != NULLARP;ap = aptmp){
  167.             aptmp = ap->next;
  168.             if(ap->timer.start != 0)
  169.                 arp_drop(ap);
  170.         }
  171.     }
  172.     return 0;
  173. }
  174.  
  175. /* Dump ARP table */
  176. static void
  177. dumparp()
  178. {
  179.     register int i;
  180.     register struct arp_tab *ap;
  181.     char e[128];
  182.  
  183.     tprintf("received %u badtype %u bogus addr %u reqst in %u replies %u reqst out %u\n",
  184.      Arp_stat.recv,Arp_stat.badtype,Arp_stat.badaddr,Arp_stat.inreq,
  185.      Arp_stat.replies,Arp_stat.outreq);
  186.  
  187.     tprintf("IP addr         Type           Time Q Addr\n");
  188.     for(i=0;i<ARPSIZE;i++){
  189.         for(ap = Arp_tab[i];ap != (struct arp_tab *)NULL;ap = ap->next){
  190.             tprintf("%-16s",inet_ntoa(ap->ip_addr));
  191.             tprintf("%-15s",smsg(Arptypes,NHWTYPES,ap->hardware));
  192.             tprintf("%-5ld",read_timer(&ap->timer)*(long)MSPTICK/1000);
  193.             if(ap->state == ARP_PENDING)
  194.                 tprintf("%-2u",len_q(ap->pending));
  195.             else
  196.                 tprintf("  ");
  197.             if(ap->state == ARP_VALID){
  198.                 if(Arp_type[ap->hardware].format != NULL){
  199.                     (*Arp_type[ap->hardware].format)(e,ap->hw_addr);
  200.                 } else {
  201.                     e[0] = '\0';
  202.                 }
  203.                 tprintf("%s",e);
  204.             } else {
  205.                 tprintf("[unknown]");
  206.             }
  207.             if(ap->pub)
  208.                 tprintf(" (published)");
  209.             if(tprintf("\n") == EOF)
  210.                 return;
  211.         }
  212.     }
  213.     return;
  214. }
  215.